package board;

import java.io.File;
import java.io.IOException;
import java.sql.PreparedStatement;
import java.util.ArrayList;

import org.apache.ibatis.session.SqlSession;

import com.oreilly.servlet.MultipartRequest;
import com.oreilly.servlet.multipart.DefaultFileRenamePolicy;

import board.BoardVo;

// 회정정보 입력, 수정 등을 처리하는 모든 제어구를 가진 곳
public class BoardMyba {


	int fileSize = 10*1024*1024;
	private String uploadPath = "C:\\Users\\jhta\\workspace\\web_1403_2_academy\\WebContent\\upload";
	
	String fileEncoding = "UTF-8";

	// 페이지 분리 관련된 필드
	int listSize = 7;  // 한 페이지에 보여질 행수를 설정하는 부분
	int blockSize = 2; // 제일 하단에 표시하는 페이지 번호
	
	int totSize = 0;   // 검색된 데이터 총 갯수
	int totPage = 0;   // 전체 페이지수를 나타낸다.
	int totBlock = 0;
	
	int nowPage = 1;   // 현제 보고 있는 페이지를 나타낸다.
	int nowBlock = 1;  // 현재 블럭을 표시
	
	int startNo = 1;   // 목록의 시작 위치를 표시
	int endNo = 3;     // 목록의 끝 위치를 표시
	
	int startPage = 1; // 현재 블록의 시작 페이지번호
	int endPage = 2;   // 현재 블록의 끝 페이지 번호
	
	private SqlSession session;  // 커넥션 객체가 생성된 상태
	
	BoardVo BoardVo;

	public BoardMyba(){
		try{
			// BoardFactory 에서 factory를 가져다가 session을 오픈
			// getFactory는 static 형태로 만들어졌다.
			session = BoardFactory.getFactory().openSession();
		}catch(Exception ex){
			System.out.println("session 에러");
			ex.printStackTrace();
		}
	}
	
	
	/*
	 *  view로 통해서 선택한 해당 글 보기
	 */
	public BoardVo view(){
		BoardVo vo = null;
		
		try{
			int cnt = session.update("board.update_hit", BoardVo);
			if(cnt>0) session.commit();
			else session.rollback();
			
			// BoardVo의 Serial값을 가지고 오라는 명령
			vo = (BoardVo)session.selectOne("board.view", BoardVo);
			session.close();
			
		}catch(Exception ex){
			ex.printStackTrace();
		}
		return vo;
	}
	
	
	/*
	 *  게시판 글의 목록이 보이는 일반적인 게시판의 Front 영역
	 */
	
	public ArrayList<BoardVo> list(){
		ArrayList<BoardVo> data = null;
		
		try{
			// 페이지를 나타내기 위해서 전체 페이지를 계산
			totSize = (int)session.selectOne("board.page", BoardVo);
			compute();
			BoardVo.setStartNo(startNo);
			BoardVo.setEndNo(endNo);
			
			// session 은 생성자가 돌때 생성, Board 는 mapper의 namespce 값이고, list 는 id 값이다.
			data = (ArrayList)session.selectList("board.select", BoardVo);
			System.out.println("상태확인 : " + BoardVo.getSerial());
			session.close();
			
		}catch(Exception ex){
			System.out.println("list 에러");
			ex.printStackTrace();
		}
		return data;
	}
	
	
	/*
	 *  페이징을 위해서 total페이지 및 기타의 페이지 관련을 계산하는 곳
	 */
	
	public void compute(){
		// ceil은 반환타입이 long type 이라서 정수형으로 바꿔주고 1.0을 곱해야 한다.
		// 전체 페이지 수 계산
		totPage = (int)Math.ceil(totSize*1.0 / listSize);
		// 총 블록 수 계산
		totBlock = (int)Math.ceil(totPage*1.0 / blockSize);
		// 현재 블록을 표시
		nowBlock = (int)Math.ceil(nowPage*1.0 / blockSize);
		
		// 가장 끝 페이지를 표시하는데 가장 끝 페이지가 전체 페이지수를 넘어버릴 수 있기 때문에 예외처리한다.
		endPage = nowBlock * blockSize;
		startPage = endPage - blockSize + 1;
		if(totPage < endPage) endPage = totPage;
		
		endNo = nowPage * listSize;
		startNo = endNo - listSize + 1;
		if(totSize < endNo) endNo = totSize;
	}
	
	
	/*
	 *   선택한 해당 글을 수정하는 영역
	 */
	
	public boolean modify(){
		boolean flag = false;
		
		try {			
			MultipartRequest mr = new MultipartRequest(BoardVo.getRequest(), uploadPath, fileSize, fileEncoding, new DefaultFileRenamePolicy());
			// 해당 객체가 생성될때 즉시 파일은 업로드 되고 있다.
			
			String mid     = mr.getParameter("mid");
			String subject = mr.getParameter("subject");
			String content = mr.getParameter("content");
			String pwd     = mr.getParameter("pwd");
			String filename= mr.getParameter("filename");
			// sysfile 은 새로운 파일
			String sysfile = mr.getFilesystemName("newfilename");
			int    serial  = Integer.parseInt(mr.getParameter("serial"));
			String fileDelFlag = mr.getParameter("fileDelFlag"); // 삭제할건지 말건지를 확인
			
			// **** 마이바티스에 파라미터값을 던지기 위해서 피룡한 부분 **** 
			BoardVo v = new BoardVo();
			v.setMid(mid);
			v.setSubject(subject);
			v.setContent(content);
			v.setPwd(pwd);
			v.setFilename(sysfile);
			v.setSerial(serial);
			
			// 기존 첨부된 파일을 삭제
			if(fileDelFlag.equals("del")){
				fileDel(filename, serial);
			}

			int cnt = session.update("board.update", v);
			session.commit();
			
			if(cnt>0) flag = true;
			
			v = new BoardVo();
			v.setFilename(sysfile);
			v.setFileid(serial);
			
			
			// 새로운 첨부파일이 생성된 경우(내용+첨부파일이 모두 수정된 경우)
			if(sysfile != null && sysfile != ""){
				cnt = session.insert("board.newFile", v);
				if(cnt > 0){
					session.commit();
					flag = true;
				}else{
					session.rollback();
					flag = false;
				}
			}
			session.close();
			
		} catch (Exception ex) {
			ex.printStackTrace();
		}
		
		return flag;
	}
	
	
	/*
	 *  해당글의 파일을 삭제하는 부분 / 글을 삭제 할때 혹은 글을 수정할때 파일을 삭제하기 위해서 필요
	 */
	
	public void fileDel(String oldfile, int serial){
		String sql = "delete from brdfiles where fileid=? and filename=?";
		
		try {
			
			File file = new File(uploadPath + "/" + oldfile);
			if(file.exists()) file.delete();
			session.close();
			
		} catch (Exception ex) {
			ex.printStackTrace();
		}
	}
	
	
	/*
	 *  해당 글을 삭제
	 */
	
	public boolean del(){
		boolean flag = false;
		
		try{
			// 해당 글을 삭제하는 부분
			int cnt = session.delete("board.delete", BoardVo);
			if(cnt>0) flag = true;
			
			// 해당 글의 파일을 삭제
			if(BoardVo.getFilename()!=null && BoardVo.getFilename().equals("")){
				File file = new File(uploadPath + "/" + BoardVo.getFilename());
				if(file.exists()) file.delete();
				
				int cnt2 = session.delete("board.fileDel", BoardVo);
				if(cnt2>0) flag = true;
			}
			
			if(flag) session.commit();
			else     session.rollback();
			
			session.close();
			
		}catch(Exception ex){
			ex.printStackTrace();
		}
		
		return flag;
	}
	
	
	/*
	 *  게시판에 글을 삽입
	 */
	
	public boolean insert() {
		boolean flag = false;
		
		try {
			MultipartRequest mr = new MultipartRequest(BoardVo.getRequest(), uploadPath, fileSize, fileEncoding, new DefaultFileRenamePolicy());
			// 입력된 값을 매개변수로 받아서 저장
			String part    = mr.getParameter("part");
			String mid     = mr.getParameter("mid");
			String subject = mr.getParameter("subject");
			String content = mr.getParameter("content");
			String pwd     = mr.getParameter("pwd");
			String orifile = mr.getOriginalFileName("filename");
			String sysfile = mr.getFilesystemName("filename");

			// **** BoardMyba.java 파일에 파라미터값을 던지기 위해서 필요한 부분 **** 
			BoardVo v = new BoardVo();
			v.setPart(part);
			v.setMid(mid);
			v.setSubject(subject);
			v.setContent(content);
			v.setPwd(pwd);
			v.setFilename(sysfile);
			
			int cnt = session.insert("board.insert",v);
			
			if(cnt>0){
				session.commit();
				flag = true;
			}
			
			session.close();
			
		} catch (IOException e) {
			e.printStackTrace();
		}
		return flag;
	}

	
	/*
	 *  해당 글의 Reply 글을 등록하는 부분
	 */
	
	public boolean repInsert(){
		boolean flag = false;
		
		try {
			MultipartRequest mr = new MultipartRequest(BoardVo.getRequest(), uploadPath, fileSize, fileEncoding, new DefaultFileRenamePolicy());
			
			String part = mr.getParameter("part");
			String mid = mr.getParameter("mid");
			String subject = mr.getParameter("subject");
			String content = mr.getParameter("content");
			String pwd = mr.getParameter("pwd");
			String orifile = mr.getOriginalFileName("filename");
			String sysfile = mr.getFilesystemName("filename");
			int grp = Integer.parseInt(mr.getParameter("grp"));
			String deep = mr.getParameter("deep");

			// **** BoardMyba.java 파일에 파라미터값을 던지기 위해서 필요한 부분 **** 
			BoardVo v = new BoardVo();
			v.setPart(part);
			v.setMid(mid);
			v.setSubject(subject);
			v.setContent(content);
			v.setPwd(pwd);
			v.setFilename(sysfile);
			v.setGrp(grp);
			v.setDeep(deep);
			
			// 위의 셋팅된 값을 board.xml > Mapper > id=repl 인 곳에 넣는다.
			int cnt = session.insert("board.repl", v);
			
			if(cnt>0){
				session.commit();
				flag = true;
			}
			session.close();
						
		} catch (IOException e) {
			e.printStackTrace();
		}
		return flag;
	}
	
	
	public BoardVo getBoardVo() {
		return BoardVo;
	}
	public void setBoardVo(BoardVo BoardVo) {
		this.BoardVo = BoardVo;
	}
	
	public int getListSize() {
		return listSize;
	}

	public void setListSize(int listSize) {
		this.listSize = listSize;
	}

	public int getBlockSize() {
		return blockSize;
	}

	public void setBlockSize(int blockSize) {
		this.blockSize = blockSize;
	}

	public int getTotSize() {
		return totSize;
	}

	public void setTotSize(int totSize) {
		this.totSize = totSize;
	}

	public int getTotPage() {
		return totPage;
	}

	public void setTotPage(int totPage) {
		this.totPage = totPage;
	}

	public int getTotBlock() {
		return totBlock;
	}

	public void setTotBlock(int totBlock) {
		this.totBlock = totBlock;
	}

	public int getNowPage() {
		return nowPage;
	}

	public void setNowPage(int nowPage) {
		this.nowPage = nowPage;
	}

	public int getNowBlock() {
		return nowBlock;
	}

	public void setNowBlock(int nowBlock) {
		this.nowBlock = nowBlock;
	}

	public int getStartNo() {
		return startNo;
	}

	public void setStartNo(int startNo) {
		this.startNo = startNo;
	}

	public int getEndNo() {
		return endNo;
	}

	public void setEndNo(int endNo) {
		this.endNo = endNo;
	}

	public int getStartPage() {
		return startPage;
	}

	public void setStartPage(int startPage) {
		this.startPage = startPage;
	}

	public int getEndPage() {
		return endPage;
	}

	public void setEndPage(int endPage) {
		this.endPage = endPage;
	}

}
